package com.smasher.modbus.proxy;

public interface ModbusComm<T extends ModbusCommParam> {

    void init(T param);

    void open();

    void close();


    //===================================================================================

    /**
     * 读多个线圈寄存器
     *
     * @param slave          从站地址
     * @param startAddress   起始地址
     * @param numberOfPoints 读取线圈寄存器个数
     */
    public void readCoils(int slave, int startAddress, int numberOfPoints);

    //读单个线圈寄存器
    public void readCoil(int slave, int address);


    /**
     * 读多个离散输入寄存器
     *
     * @param slave          从站地址
     * @param startAddress   起始地址
     * @param numberOfPoints 读取离散输入寄存器个数
     */
    public void readDiscreteInputs(int slave, int startAddress, int numberOfPoints);

    //读单个离散输入寄存器
    public void readDiscreteInput(int slave, int address);


    /**
     * 读多个保持寄存器
     *
     * @param slave          从站地址
     * @param startAddress   起始地址
     * @param numberOfPoints 读取保持寄存器个数
     */
    public void readHoldingRegisters(int slave, int startAddress, int numberOfPoints);

    //读单个保持寄存器
    public void readHoldingRegister(int slave, int address);


    /**
     * 读多个输入寄存器
     *
     * @param slave          从站地址
     * @param startAddress   起始地址
     * @param numberOfPoints 读取输入寄存器个数
     */
    public void readInputRegisters(int slave, int startAddress, int numberOfPoints);

    //读单个输入寄存器
    public void readInputRegister(int slave, int address);


    /**
     * 写单个线圈寄存器
     *
     * @param slave   从站地址
     * @param address 写入寄存器地址
     * @param value   写入值（true/false)
     */
    public void writeSingleCoil(int slave, int address, boolean value);

    /**
     * 写单个保持寄存器
     *
     * @param slave   从站地址
     * @param address 写入寄存器地址
     * @param value   写入值
     */
    public void writeSingleRegister(int slave, int address, int value);


    /**
     * 写入多个线圈寄存器
     *
     * @param slave   从站地址
     * @param address 写入寄存器地址
     * @param data    写入数据{1,0}
     */
    public void writeCoils(int slave, int address, boolean[] data);


    /**
     * 写入多个保持寄存器
     *
     * @param slave   从站地址
     * @param address 写入寄存器地址
     * @param sCount  写入寄存器个数
     * @param data    写入数据
     */
    public void writeHoldingRegisters(int slave, int address, int sCount, short[] data);
}
